package com.nageoffer.shortlink.admin.utils;

import cn.hutool.crypto.digest.BCrypt;

/**
 * 密码加密工具类（基于 BCrypt 算法）
 * 特点：自带随机盐值、不可逆、可调节加密强度
 */
public class PasswordEncoderUtils {

    /**
     * 工作因子（加密强度）：范围 4-31，值越大加密越慢（安全性越高）
     * 推荐 10-12（平衡安全性和性能）
     */
    private static final int WORK_FACTOR = 12;

    /**
     * 加密明文密码
     *
     * @param rawPassword 明文密码（用户输入的原始密码）
     * @return 加密后的密码字符串（包含盐值，可直接存储到数据库）
     */
    public static String encode(String rawPassword) {
        if (rawPassword == null || rawPassword.trim().isEmpty()) {
            throw new IllegalArgumentException("明文密码不能为空");
        }
        // BCrypt.hashpw 会自动生成随机盐值，并将盐值混入加密结果中
        return BCrypt.hashpw(rawPassword, BCrypt.gensalt(WORK_FACTOR));
    }

    /**
     * 验证明文密码与加密密码是否匹配
     *
     * @param rawPassword     明文密码（用户输入的待验证密码）
     * @param encodedPassword 加密后的密码（从数据库查询的密码）
     * @return true-匹配，false-不匹配
     */
    public static boolean matches(String rawPassword, String encodedPassword) {
        if (rawPassword == null || rawPassword.trim().isEmpty()) {
            return false;
        }
        if (encodedPassword == null || encodedPassword.trim().isEmpty()) {
            return false;
        }
        // BCrypt.checkpw 会从加密结果中提取盐值，与明文密码重新加密后比对
        return BCrypt.checkpw(rawPassword, encodedPassword);
    }
}